(function(factory) {
	if (typeof define === "function" && define.amd) {
		// AMD. Register as an anonymous module.
		define(factory);
	} else {
		// Browser globals
		factory();
	}
}(function() {
			/**
			 * @author 李球 <service@hteos.com>
			 * @class HteOS.TaskManager 任务管理器
			 * @singleton
			 */
			HteOS.TaskManager = {
				
				init : function(){
					
					var tasks = this.tasks;
					
					HteOS.EventManager.on("hte.window.close", function(win) {
						delete tasks[win.taskId];
					});
					
					HteOS.EventManager.on("hte.page.close", function(page) {
						delete tasks[page.taskId];
					});
					
					//处理快速启动，可以通过设置data-launcher属性来启动应用
					$(document.body).on("click", "[data-launcher='app']", function(event) {
						var launcher = $(this).data("app"),
							app = HteOS.app.AppManager.getByKey(launcher);
						if (app) {
							HteOS.TaskManager.start(app);
						}
						event.stopPropagation();
					});
					
					$(document.body).on("click", "[data-launcher='window']", function(event) {
						var config = $(this).data();
						config.mode = 'window';
						config.name = config.title;
						config.click='open';
						if(config.path){
							HteOS.TaskManager.start(config);
						}
					});
					
					$(document.body).on("click", "[data-launcher='messager']", function(event) {
						var config = $(this).data();
						console.log(config);
						if(config.title && config.content){
							HteOS.Messager.alert(config.title,config.content);
						}
					});
					
					
					/**
					 * 通过DOM属性来启动页面
					 * */
					$(document.body).on("click", "[data-page]", function(event) {
						var el = $(this),
							pageId = el.data("hte-page-id"),
							page;
						if (pageId) {
							//获取侧边栏
							page = HteOS.page.PageManager.get(pageId);
						}
						//判断是否已经打开了页面
						if (!page) {
							//没有打开则新建页面，并向原元素设置页面ID
							page = HteOS.page.PageManager.create({
								name: el.data("name"),
								path: el.data("path"),
								loadType :el.data('loadType'),
								closable:el.data('closable') == "true" ? true : false
							});
							el.data("hte-page-id", page.id);
						}
						page.show();
						event.stopPropagation();
					});
				},

				/**
				 * @property 任务集合
				 */
				tasks : {},

				/**
				 * 执行应用，打开窗口或者打开侧边栏，或者执行代码
				 */
				start : function(config) {
					if (config.click == "open" || (config.mode == 'window' || config.mode == 'dock') || HteOS.UA.Mobile) {
						if(config.path || config.module){
							this.execute(config);
						}	
					} else {
						if(config.handler){
							config.handler.call(config);
						}
					}
				},
				
				/**
				 * 执行应用，打开窗口或者打开侧边栏，或者执行代码
				 */
				execute : function(config){
					var fn = HteOS.UA.Mobile === true ? this.executeMobile : this.executeDesktop;
					fn.call(this,config);
				},
				
				/**
				 * 运行移动端程序
				 */
				executeMobile : function(config){
					var task = this.tasks[config.id];
					if (task) {
						task.shell.show();
					}else{
						task = {};
						HteOS.apply(task,{
							id : config.id,
							name : config.name,
							path : config.path
						});
						this.tasks[task.id] = task;
						var page = HteOS.page.PageManager.open({
							name: config.name,
							path: config.path,
							//FIXME 应用中增加属性来定义加载方式
							loadType:config.loadType ? config.loadType : (config.mode == 'dock' ? 'ajax' : 'iframe'),
							closable:config.closable !== false ? true : false
						});
						task.shell = page;
						page.taskId = task.id;
					}
				},
				
				/** 运行桌面程序
				 * @param {Object} config
				 */
				executeDesktop : function(config){
					var task = this.tasks[config.id];
					if(config.mode == 'new_window'){
						window.open(config.path);
					}
					if (task) {
						if (task.mode == "dock") {
							task.shell.show();
						}else{
							task.shell.front();
						}
						
						//强制刷新，目前只实现了窗口组件刷新
						if(config.refresh == true){
							task.shell.refresh(config.path);
						}
						
					} else {
						task = {};
						HteOS.apply(task,{
							id : config.id,
							name : config.name,
							mode : config.mode,
							icon : config.icon,
							path : config.path
						});
						if (task.mode == "dock") {
							task.loadType = config.loadType;
							var dock = new HteOS.dock.Dock(task);
							dock.show();
							task.shell = dock;
						} else {
							var animateTarget;
							//针对点击磁贴启动
							if(HteOS.isMetro() && config.hidden !== false){
								var tile = HteOS.metro.View.getTile(config.id);
								if(tile){
									animateTarget = tile.getEl(); 
								}
							}
							HteOS.applyIf(task,{
								animateTarget : animateTarget,
								width : config.width,
								height : config.height,
								resizable : config.resizable,
								maximizable : config.maximizable,
								right : config.right,
								left : config.left,
								top : config.top,
								bottom : config.bottom,
								maximized : config.maximized ,
								loadType : config.loadType
							});
							var win = new HteOS.window.Window(task);
							task.shell = win;
							
						}
						this.tasks[task.id] = task;
						
					}
					return task.shell;
				},
				
				getTask:function(id){
					return this.tasks[id];
				},
				
				stop : function(id){
					var me = this;
					var task = me.getTask(id);
					if(task.prevent){
						HteOS.Messager.confirm("提示",task.prevent,function(btn){
							if(btn == 'yes'){
								doStop(task);
							}
						});
					}else{
						doStop(task);
					}
					function doStop(task){
						var extra = task.shell.close();
						if(task.onClose){
							task.onClose.call(extra);
						}
					}
				},

				getShell : function(id) {
					var task = this.tasks[id];
					if(task){
						return task.shell;
					}
				}

			};
		}));